home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_087 / id-handler / loader.asm < prev    next >
Assembly Source File  |  1992-05-06  |  2KB  |  120 lines

  1. ; loader.asm
  2.  
  3.  
  4.         INCLUDE "exec/types.i"
  5.         INCLUDE "exec/exec.i"
  6.         INCLUDE "libraries/dosextens.i"
  7.  
  8.  
  9.         STRUCTURE    STACKDATA,0
  10.         APTR    Packet
  11.         LONG    ReturnVal
  12.         APTR    DOSBase
  13.         BPTR    Segment
  14.         BYTE    STACKDATA_SIZE
  15.  
  16.  
  17. XLIB:        MACRO
  18.         XREF    _LVO\1
  19.         ENDM
  20.  
  21. LINKEXE:    MACRO
  22.         MOVEA.L _AbsExecBase,A6
  23.         JSR    _LVO\1(A6)
  24.         ENDM
  25.  
  26. LINKDOS:    MACRO
  27.         MOVEA.L DOSBase(SP),A6
  28.         JSR    _LVO\1(A6)
  29.         ENDM
  30.  
  31.  
  32. _AbsExecBase    EQU    4
  33.  
  34.  
  35.         XLIB    OpenLibrary
  36.         XLIB    CloseLibrary
  37.         XLIB    LoadSeg
  38.         XLIB    UnLoadSeg
  39.  
  40.  
  41. ;----------------------------------------------------------------------------
  42.  
  43. StartModule:    DC.L    (EndModule-StartModule)/4    ; for BCPL linking
  44.  
  45.  
  46. EntryPoint:    SUBA.L    #STACKDATA_SIZE,SP
  47.  
  48.         LSL.L    #2,D1            ; convert to byte pointer
  49.         MOVE.L    D1,Packet(SP)
  50.  
  51.         CLR.L    ReturnVal(SP)        ; no error - for now
  52.  
  53.  
  54. OpenDOS:    LEA    DOSName(PC),A1
  55.         CLR.L    D0
  56.         LINKEXE OpenLibrary
  57.         MOVE.L    D0,DOSBase(SP)
  58.         BNE    LoadCode
  59.  
  60.         MOVE.L    #ERROR_INVALID_RESIDENT_LIBRARY,ReturnVal(SP)
  61.         BRA    Return
  62.  
  63.  
  64. LoadCode:    LEA    HandlerName(PC),A1
  65.         MOVE.L    A1,D1
  66.         LINKDOS LoadSeg
  67.         MOVE.L    D0,Segment(SP)
  68.         BNE    CallHandler
  69.  
  70.         MOVE.L    #ERROR_OBJECT_NOT_FOUND,ReturnVal(SP)
  71.         BRA    CloseDOS
  72.  
  73.  
  74. CallHandler:    LEA    SPsave(PC),A1
  75.         MOVE.L    SP,(A1)         ; save current SP
  76.  
  77.         MOVE.L    Segment(SP),D0        ; BPTR to segment
  78.         LSL.L    #2,D0
  79.         MOVEA.L D0,A0            ; byte pointer to segment
  80.         MOVE.L    Packet(SP),D0        ; packet address
  81.         MOVE.L     D0,-(SP)        ; push (not sure if safe above)
  82.  
  83. ; --- Now, call the loaded handler code.
  84. ; --- It is sent the byte address of the startup packet passed to this code.
  85.  
  86.         JSR    4(A0)            ; call first code in segment
  87.  
  88.         MOVEA.L SPsave(PC),SP        ; restore SP
  89.  
  90.  
  91. UnloadCode:    MOVE.L    Segment(SP),D1
  92.         LINKDOS UnLoadSeg
  93.  
  94. CloseDOS:    MOVE.L    DOSBase(SP),A1
  95.         LINKEXE CloseLibrary
  96.  
  97. Return:     MOVE.L    ReturnVal(SP),D0    ; retrieve return value
  98.         ADDA.L    #STACKDATA_SIZE,SP
  99.         RTS
  100.  
  101.  
  102. SPsave:     DC.L    0
  103.  
  104. DOSName:    DOSNAME
  105.  
  106. HandlerName:    DC.B    'L:'
  107. AProcessName:    DC.B    'ID-handler',0
  108.  
  109.  
  110. ;    trailing definitions for BCPL linking
  111.  
  112.         CNOP    0,4            ; align to lonword boundary
  113.  
  114.         DC.L    0            ; End Marker
  115.         DC.L    1            ; Global 1
  116.         DC.L    EntryPoint-StartModule    ; Offset
  117.         DC.L    1            ; Highest Global Used
  118.  
  119. EndModule:    END
  120.